#pragma once

#include <stdint.h>
typedef enum {
    C485_RUN_STATE_STARTING = 0x01, // 启动中
    C485_RUN_STATE_NORMAL,          // 正常运行
    C485_RUN_STATE_OTA,             // OTA升级
    C485_RUN_STATE_FAULT,           // 故障
    C485_RUN_STATE_CONNECTED,       // 接受过0101指令，可以开始通讯
}C485RunState;

typedef enum {
    C485_FAULT_CODE_NONE = 0x0000,  // 无故障
    C485_FAULT_CODE_TEMP = 0x0001,  // 温度传感器故障
    C485_FAULT_CODE_HUMI = 0x0002,  // 湿度传感器故障
    C485_FAULT_CODE_HIGH = 0x0004,  // 高温报警
    C485_FAULT_CODE_LOW = 0x0008,   // 低温报警
    C485_FAULT_CODE_POW = 0x0010,   // 断电报警
    C485_FAULT_CODE_VBAT = 0x0020,  // 电池电量低报警
    C485_FAULT_CODE_DOOR = 0x0040,  // 门未关报警
} C485FaultCodes;

typedef enum {
C485_NET_4G_DOING = 0x0001,         // 4G 联网中
C485_NET_4G_DONE = 0x0002,          // 4G 联网成功
C485_NET_4G_WEAK = 0x0004,          // 4G 网络信号弱
C485_NET_SIM_NONE = 0x0008,         // 读卡失败或无 SIM 卡
C485_NET_WIFI_DONE = 0x0010,        // WIFI 连接正常
C485_NET_WIFI_NONE = 0x0020,        // WIFI 连接失败
C485_NET_HUB_DONE = 0x0040,         // HUB 板连接正常
C485_NET_HUB_NONE = 0x0080,         // HUB 板连接失败
C485_NET_CAM_DONE = 0x0100,         // 摄像头连接正常
C485_NET_CAM_NONE = 0x0200,         // 摄像头连接失败
C485_NET_SRV_ERROR = 0x0400,        // 服务器注册失败
C485_NET_SIM_FAULT = 0x0800,        // 无效或非法的 SIM 
} C485NetState;

typedef struct {
    uint8_t* buf;
    uint16_t size;
    uint16_t pos;
    uint16_t timer;
} C485PkgHandle;
#pragma pack(1)
typedef struct {
    uint8_t flag;           // 指令头：固定值0xDD
    uint16_t len;           // 总长度：2 字节，0x0000 - 0xFFFF（HEX 格式，高位先发），机器号、指令 ID 和数据报文的字节数之和
    uint8_t machine_num;    // 机器号：1 字节, 0x01：主机机器号，（智能模块机器号 01）; 0x02：从机机器号；（温控器机器号 02）
    uint16_t cmd;           // 指令ID：2 字节，0x0000 - 0xFFFF（HEX 格式，高位先发
    uint8_t ordinal;        // 多冰库时冰库序号(0-全部冰库)/或(OTA时)报文序号
    uint8_t block_num;      // 数据块数
    uint8_t data[0];
} C485PkgHead;
// typedef struct {
//     uint8_t type;           // 数据类型, 1 字节，0x01-0x04
//     uint16_t data_num;      // 数据个数
//     uint8_t data[];         // 指令ID：2 字节，0x0000 - 0xFFFF（HEX 格式，高位先发
// } C485Block;
typedef struct {
    uint8_t checksum;       // 将指令中除指令头尾和校验值以外的数据进行异或的算法得出
    uint8_t flag;           // 指令尾， 固定值0x88
} C485Tail;
#pragma pack()

extern void C485Task(void);
